#include "ringQueue.hpp"
#include <time.h>
#include <sys/types.h>
#include <unistd.h>

//消费者
void* consumer(void* args)
{
    RingQueue<int>* rq = (RingQueue<int>*)args;
    while(true)
    {
        //创建想要传取出的任务
        int x;
        //从公共空间取出任务
        rq->Pop(x);
        sleep(1);
        std::cout << "消费者：" << x << "  线程id:"  << pthread_self() << std::endl;
    }
}
//生产者
void* producer(void* args)
{
    RingQueue<int>* rq = (RingQueue<int>*)args;
    while(true)
    {
        //创建想要传进去的任务
        int x = rand() % 100;
        //从公共空间放入
        std::cout << "生产者：" << x << "  线程id:"  << pthread_self() << std::endl;
        rq->Push(x);
    }
}

// int main()
// {
//     srand((uint16_t)time(nullptr) ^ getpid());
//     pthread_t c[2],p[3];
//     RingQueue<int>* rq = new RingQueue<int>();
//     pthread_create(c,nullptr,consumer,rq);
//     pthread_create(c+1,nullptr,consumer,rq);
//     pthread_create(p,nullptr,producer,rq);
//     pthread_create(p+1,nullptr,producer,rq);
//     pthread_create(p+2,nullptr,producer,rq);

//     for(int i = 0;i < 2;i++) pthread_join(c[i],nullptr);
//     for(int i = 0;i < 3;i++) pthread_join(p[i],nullptr);
//     return 0;
// }

int main()
{
    srand((uint64_t)time(nullptr) ^ getpid());
    RingQueue<int> *rq = new RingQueue<int>();
    // rq->debug();
    pthread_t c[3],p[2];
    pthread_create(c, nullptr, consumer, (void*)rq);
    pthread_create(c+1, nullptr, consumer, (void*)rq);
    pthread_create(c+2, nullptr, consumer, (void*)rq);

    pthread_create(p, nullptr, producer, (void*)rq);
    pthread_create(p+1, nullptr, producer, (void*)rq);

    for(int i = 0; i < 3; i++) pthread_join(c[i], nullptr);
    for(int i = 0; i < 2; i++) pthread_join(p[i], nullptr);
    return 0;
}